package core;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 *  * author:木易阿发
 *  * time：220707
 *  * moditime：220710
 *
 * 客户端：
 * 1、创建创建socket连接:构造方法里通过new socket指定ip和端口 实现连接  √
 * 2、向服务器发送消息
 * 3、接受其他客户端（主机广播）发送过来的信息
 */
public class Clients {
    private Socket socket;//内部类可用

    public static void main(String[] args) {
        Clients clients = new Clients();
        clients.start();
    }

    //构造完成器启动时连接
    public Clients() {
        try {
            System.out.print("启动客户端...（");
            this.socket = new Socket("localhost",8889);
            System.out.println("连接成功！）");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start(){//向服务器发送消息
        try {

            //启动一个线程来接收服务器广播过来的其他客户端消息并打印在控制台
            Runnable serverHandler= new ServerHandler();
            Thread thread = new Thread(serverHandler);
            thread.setDaemon(true);//设置为守护线程
            thread.start();


            OutputStream os = socket.getOutputStream();//通过socket获取字节输出流
            OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);//字节转换流，将字符转换诶字节写出指定编码
            BufferedWriter bw = new BufferedWriter(osw);//缓冲输出流，保证语句的完整性
            PrintWriter pw = new PrintWriter(bw,true);//字符输出流（特别注意开启行刷新），按行写出控制台输入的消息
            String lines;
            Scanner ins = new Scanner(System.in);
            System.out.println("欢迎来到发哥聊天室，累了输入\"exit\"结束聊天！");
            while (true) {
//                System.out.print("输入发送：");
                lines = ins.nextLine();
                if ("exit".equals(lines)) {
                    System.out.println("拜拜咯，下次再见！");
                    break;
                } else if ("".equals(lines)) {
                    System.out.print("\" \"-->空消息发送失败!!!\n");
                    continue;
                }
                pw.println(lines);//写出消息数据
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();//关闭服务器连接同时也关闭流连接
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //读取服务器广播送过来的消息并过滤本机发送的消息，打印在控制台
    private class ServerHandler implements Runnable{
        @Override
        public void run() {//交互任务
            try {
                InputStream is = socket.getInputStream();//通过socket获取输入流，得到服务端发广播的消息
                InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);//字符转换流，将is的字节流转换为字符
                BufferedReader br = new BufferedReader(isr);//缓冲字节输入流，块读取
                String line;
                while((line = br.readLine())!=null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
//                e.printStackTrace();
            }
        }
    }
}
